package com.six.epidemic.admin.controller

import Md5Utils
import com.six.epidemic.admin.entity.EpidemicAdmin
import com.six.epidemic.admin.entity.vo.LoginUser
import com.six.epidemic.admin.service.IEpidemicAdminService
import com.six.library.model.ResultData
import com.six.library.utils.JWTUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/epiadmin")
@CrossOrigin
class EpidemicAdminController {
    @Autowired(required = true)
    private lateinit var service: IEpidemicAdminService

    /**
     * 登录
     *
     * @param admin
     * @return
     */
    @RequestMapping("/login")
    fun login(@RequestBody admin: EpidemicAdmin): ResultData {
        /**
         * 实现思路
         * 1. 获得数据（用户名和密码），封装到userinfo
         * 2. 验证数据有效性
         * 3. 判断是否存在此用户名，不存在此用户名，返回数据
         * 4. 如果存在此用户名，再判断密码是否正确，注意密码加密后进行对比，如果密码不正确，返回数据
         * 5. 密码正确，登录成功，生成token,返回数据
         */
        //  1. 获得数据（用户名和密码），封装到userinfo
        // 获得用户名
        val username = admin.username
        // 获得密码
        val userpwd = admin.userpwd
        // 创建返回数据对象
        val result = ResultData()
        // 2. 验证数据有效性
        if (username == null || "" == username.trim { it <= ' ' }) {
            result.statusCode = 303
            result.message = "用户名不能为空"
            return result
        }
        if (userpwd == null || "" == userpwd.trim { it <= ' ' }) {
            result.statusCode = 303
            result.message = "密码不能为空"
            return result
        }
        //3. 判断是否存在此用户名，不存在此用户名，返回数据
        try {
            // 调用业务层
            val resultUser: EpidemicAdmin? = service.ckUsername(admin.username)
            if (resultUser != null) { //存在此用户
                //4. 如果存在此用户名，再判断密码是否正确，注意密码加密后进行对比，如果密码不正确，返回数据
                if (Md5Utils.md5(userpwd).equals(resultUser.userpwd)) { // 密码正确
                    // 登录成功了
                    // 5. 密码正确，登录成功，生成token,返回数据
                    val jwtToken: String = JWTUtils.createJwtToken(resultUser.id.toString(), resultUser.username)
                    // 生成登录成功的对象
                    val loginUser = LoginUser()
                    loginUser.userid = resultUser.id
                    loginUser.username = resultUser.username
                    loginUser.usertype = resultUser.utype.toString()
                    loginUser.provinces = resultUser.provinces
                    loginUser.jwtToken = jwtToken
                    // 登录成功能设置返回的数据
                    result.statusCode = 200
                    result.message = "登录成功"
                    result.setData(loginUser)

                    // 更新最后一次登录时间
                    service.update(resultUser)
                } else {
                    // 登录失败，密码不正确
                    result.statusCode = 300
                    result.message = "登录失败，密码不正确"
                }
            } else { //不存存此用户名
                result.statusCode = 404
                result.message = "登录失败，不存在此用户名"
            }
        } catch (ex: Exception) {
            ex.printStackTrace()
            result.statusCode = 500
            result.message = "登录失败，请与管理员联系"
        }
        return result
    }

    @RequestMapping("/reguser")
    fun regUser(@RequestBody admin: EpidemicAdmin): ResultData {
        val result = ResultData()

        try {
            val rows: Int = service.add(admin)
            if (rows > 0) {  // 存在此用户名
                result.statusCode = 200
                result.message = "已成功添加新的工作管理人员"
            } else { // 不存在此用户
                result.statusCode = 300
                result.message = "添加新的工作管理人员失败"
            }
        } catch (ex: Exception) {
            println(ex)
            result.statusCode = 500
            result.message = "添加数据出错，请与管理员联系"
        }
        return result
    }

    @RequestMapping("/ckusername/{username}")
    fun ckUserName(@PathVariable("username") username: String?): ResultData {
        val result = ResultData()
        println(username)
        // 2. 验证数据有效性
        if (username == null || "" == username.trim { it <= ' ' }) {
            result.statusCode = 303
            result.message = "用户名不能为空"
            return result
        }
        try {
            // 调用业务层
            val resultUser: EpidemicAdmin ?= service.ckUsername(username)
            if (resultUser != null) { //存在此用户
                result.statusCode = 200
                result.message = "已存在此用户名"
            } else {
                result.statusCode = 404
                result.message = "不存在此用户名"
            }
        } catch (ex: Exception) {
            println(ex)
            result.statusCode = 500
            result.message = "查询数据出错，请与管理员联系"
        }
        return result
    }
}